package com.xinzhidi.web.netty.utils;

import org.apache.commons.lang3.StringUtils;

/***
 * 十六进制字符串工具类
 *
 * @author cx
 * @date 2023/6/1 11:55
 */
public class HexadecimalUtil {

    /**
     * 前缀(小写)
     */
    public static final String PREFIX_LOWER = "fe";

    /**
     * 前缀(大写)
     */
    public static final String PREFIX_UPPERCASE = "FE";

    public static void main(String[] args) {

//        System.out.println(convertToHighLow("123456"));

        // 例子消息
        String message = "FEFEFE6846547113430000000406AC0401016100";
        System.out.println("校验码为：" + getCheckCode(message));

//        String message = "FEFEFE6846122333444455550403015802";
//        System.out.println("校验码为：" + getCheckCodeByAllData(message));
    }

    public static String getCheckCode(String message) {
        message = StringUtils.deleteWhitespace(message)
                .replaceAll(PREFIX_LOWER, "")
                .replaceAll(PREFIX_UPPERCASE, "")
                .replace("|", "").toUpperCase();
        System.out.println("message长度为：" + message.length());
        System.out.println("message为：" + message);
        // 将十六进制字符串转换为字节数组
        byte[] bytes = hexStringToByteArray(message);
        // 计算校验和
        byte checksum = calculateChecksum(bytes);
        String hexChecksum = String.format("%02x", checksum).toUpperCase();
        System.out.println("全部的message为：FEFEFE" + message + hexChecksum + "16");
        return hexChecksum;
    }

    /**
     * 检验接收的信息验证码是否正确
     *
     * @param message 消息
     * @return java.lang.String
     * @author cx
     * @date 2023/7/22 18:07
     **/
    public static boolean getCheckCodeByAllData(String message) {
        boolean flag = false;
        message = StringUtils.deleteWhitespace(message)
                .replaceAll(PREFIX_LOWER, "")
                .replaceAll(PREFIX_UPPERCASE, "")
                .replace("|", "").toUpperCase();
        //原始数据中的验证码
        String code = message.substring(message.length() - 4, message.length() - 2).toUpperCase();
        //原始数据除开验证码和结束符的数据
        String data = message.substring(0, message.length() - 4);
        String checkCode = getCheckCode(data).toUpperCase();
        //判断原始数据中的验证码和计算出来的验证码是否一致
        if (code.equals(checkCode)) {
            flag = true;
        }
        return flag;
    }


    /**
     * 将十六进制字符串转换为字节数组
     */
    public static byte[] hexStringToByteArray(String s) {
        System.out.println("s为===============================："+s);
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i + 1), 16));
        }

        return data;
    }

    /**
     * 计算校验和
     *
     * @param bytes 字节数组
     * @return 校验和(byte字节)
     */
    public static byte calculateChecksum(byte[] bytes) {
        byte checksum = 0;
        for (int i = 0; i < bytes.length; i++) {
            checksum += bytes[i];
        }
        return checksum;
    }

    /**
     * 高低位转换  如：0600转为0006 123456转为563412
     *
     * @param message 需要转换的字符串
     * @param hex     是否是十六进制（0：不是  1：是   默认0）
     */
    public static String convertToHighLow(String message, Integer hex) {
        String value = "";
        String m = "";
        for (int i = 0; i < message.length(); i++) {
            m += message.charAt(i);
            if ((i + 1) % 2 == 0) {
                value = m + value;
                m = "";
            }
        }
        if (hex == 0) {
            value = String.valueOf(FormatData.hex2decimal(value));
        }
        return value;
    }

    /**
     * 高低位转换  转换已经为16进制的字符串
     */
    public static String hexConvertToHighLow(String message) {
        String value = "";
        String m = "";
        for (int i = 0; i < message.length(); i++) {
            m += message.charAt(i);
            if ((i + 1) % 2 == 0) {
                value = m + value;
                m = "";
            }
        }
        return value;
    }


}
